using System;
using System.Data;
using System.Collections.Generic; //Aca esta el tipo de dato lista
using nmspDataWEB;
using nmspEDITORIAL;
using nmspLIBRO;
using nmspUSUARIO;

namespace nmspLIBROENINVENTARIO
{
    public class LibroEnInventario
    {
        private Database db_conexion = new Database(); //objeto que maneja las bases de datos

        private nmspLIBRO.Libro ElLibro; //Objeto Libro
        private int idlibro;
        private System.DateTime fe_alta;
        private string disponible; //"S" de que esta disponible "N" de que no esta

        public LibroEnInventario()
        { }

        //***************************************************************************
        //constructor solo con el id - 
        //quiere decir que se trata de una lectura de la base de datos
        //Traigo toda la data de la base para crear los objetos
        //***************************************************************************
        public LibroEnInventario(int pidlibro)
        {
            this.idlibro = pidlibro;
            if (!leerIdLibro())
                this.idlibro=0;
        }

        //***************************************************************************
        //constructor contodos los datos ********************************************
        public LibroEnInventario(string ptitulo,
            string pimagen_libro,
            string pautor,
            string pnombre_editorial, 
            int pidlibro,
            System.DateTime pfe_alta, 
            string pdisponible)
        {
            this.ElLibro = new Libro(ptitulo, pimagen_libro, pautor, pnombre_editorial);
            this.idlibro    = pidlibro;
            this.fe_alta    = pfe_alta;
            this.disponible = pdisponible;
        }

        //***************************************************************************
        //constructor con todos los datos pero el libro es un objeto ****************
        public LibroEnInventario(nmspLIBRO.Libro UnLibro,
            int pidlibro,
            System.DateTime pfe_alta,
            string pdisponible)
        {
            this.idlibro    = pidlibro;
            this.fe_alta    = pfe_alta;
            this.disponible = pdisponible;
            this.ElLibro    = new Libro(UnLibro);
        }

        //***************************************************************************
        //constructor solo con los datos del libro **********************************
        public LibroEnInventario(string ptitulo,
            string pimagen_libro,
            string pautor, 
            string pnombre_editorial)
        {
            this.ElLibro = new Libro(ptitulo, pimagen_libro, pautor, pnombre_editorial);
        }

        //***********************************************************************
        //constructor solo con el objeto libro **********************************
        public LibroEnInventario(nmspLIBRO.Libro UnLibro)
        {
            this.ElLibro = new Libro(UnLibro); 
        }

        // ***************************************************************************
        // retorna una copia del objeto libro que esta dentro de este objeto
        public nmspLIBRO.Libro getLibro()
        {
            return this.ElLibro.getLibro();
        }

        // ***************************************************************************
        // Asigna un objeto libro al objeto Libro dentro de esta clase
        public void setLibro(nmspLIBRO.Libro UnLibro)
        {
            this.ElLibro = new Libro(UnLibro);
        }

        // ************************************************************
        public int getIdLibro()
        {
            return this.idlibro;
        }

        // ************************************************************
        public string getDisponible()
        { 
            return disponible;
        }

        public void setDisponible(string pdisponible)
        { 
            this.disponible = pdisponible; 
        }

        // ************************************************************
        public System.DateTime getfe_alta()
        {
            return this.fe_alta;
        }

        public void setfe_alta(System.DateTime pfe_alta)
        {
            this.fe_alta = pfe_alta; 
        }

        // **************************************************************
        // **************************************************************
        // **************************************************************
        // **************************************************************
        // FUNCIONES QUE VAN A INTERACTUAR CONLA BASE DE DATOS
        // **************************************************************
        // **************************************************************
        // **************************************************************

        private bool leerIdLibro()
        {
            bool retornar_leeridlibro = false;
            int id_editorial_aux;
            nmspEDITORIAL.Editorial EditorialAuxiliar;

            DataTable dttable = new DataTable();
            string sql;

            sql ="SELECT tblLibros.Titulo, "; 
            sql +="tblLibros.Fe_Carga, "; 
            sql +="tblLibros.Disponible, ";
            sql +="tblLibros.ImagenLibro, ";
            sql +="tblLibros.Autor, ";
            sql +="tblLibros.id_Editorial "; 
            sql +="FROM tblLibros ";
            sql +="WHERE id ="+ this.idlibro;

            //creo un tipo de dato tabla con el resultado del select 
            dttable = db_conexion.GetDataTable(sql);
            //Vuelco el resultado al tipo de datos rows 
            DataRow[] dtr = dttable.Select();

            foreach (DataRow row in dtr)
            {
                this.fe_alta    = (System.DateTime)row["Fe_Carga"];
                this.disponible = (string)row["Disponible"];

                //Creo un objeto editorial conla informacion
                id_editorial_aux = System.Convert.ToInt32(row["id_Editorial"].ToString());
                EditorialAuxiliar = new Editorial(id_editorial_aux);

                //Construyo el objeto libro
                this.ElLibro = new Libro((string)row["Titulo"], (string)row["ImagenLibro"], (string)row["Autor"], EditorialAuxiliar);

                retornar_leeridlibro = true;
            }

            return retornar_leeridlibro;
        }

        //*********************************************************************
        //*********************************************************************
        public bool grabarNuevoLibroEnInventario(nmspUSUARIO.Usuario ElUsuario)
        {
            //debo realizar todas las validaciones de los datos que voy a grabar
            //+debe tener un titulo
            //+debe tener un usuario que lo carga

            bool retornar_grabar = false;
            int resultado_insert =0;
            string sql;

            if (!(this.ElLibro==null) && !(ElUsuario==null))
            {
                if (! (this.ElLibro.get_titulo().Equals("")) )
                {

                    //if (this.disponible.Equals(""))
                        this.disponible = "S";

                    //debo recuperar la editorial y saber si la grabo
                    Editorial EdAux = this.ElLibro.getEditorial();
                                      
                    //en caso que el id de editorial sea nuevo lo tengo que agregar
                    if (EdAux.get_id().Equals(0))
                        EdAux.Agregar();

                    sql = "INSERT INTO tblLibros ( Titulo, ";
                    sql += "Fe_Carga, ";
                    sql += "Disponible, ";
                    sql += "ImagenLibro, ";
                    sql += "Autor, ";
                    sql += "id_Editorial, ";
                    sql += "UserId ";
                    sql += " )VALUES(  ";
                    sql += "'" + this.ElLibro.get_titulo() + "', ";
                    sql += " GETDATE(), ";
                    sql += "'" + this.disponible.ToUpper()  + "', ";
                    sql += "'" + this.ElLibro.get_imagen_libro() + "', ";
                    sql += "'" + this.ElLibro.getAutor() + "', ";
                    sql += "" + EdAux.get_id() + ", ";
                    sql += "cast ('" + ElUsuario.getUserId() +"' as uniqueidentifier) ";
                    sql += ") ";

                    resultado_insert = db_conexion.ejecutarStatement(sql);
                    if (!resultado_insert.Equals(0))
                        retornar_grabar = true;

                }
            }

           return retornar_grabar;
        }

        // ********************************************************************************************************* 
        // ********************************************************************************************************* 
        public bool modificarLibroEnInventario
            (int pidlibro, string ptitulo, string pimagenlibro, string pautor, string peditorial, string pdisponible)
        {
            //Se llama a la funcion inicialmente declarada para realizar este paso
            bool retornar_modificar = false;

            this.ElLibro = new Libro(ptitulo, pimagenlibro, pautor, peditorial);
            this.idlibro = pidlibro;
            this.disponible = pdisponible;

            retornar_modificar = this.modificarLibroEnInventario();

            return retornar_modificar;
        }

        // *********************************************************************************************************
        // *********************************************************************************************************
        public bool modificarLibroEnInventario()
        {
            //debo realizar todas las validaciones de los datos que voy a grabar
            //No puedo modificar ni la fecha de alta, ni el usuario, ni el id de libro
            //El id de libro es de un usuario por lo que no importa de que usuario es.

            bool retornar_modificar = false;
            int resultado_update = 0;
            string sql;

            if (!(this.ElLibro == null))
            {
                if (!this.ElLibro.get_titulo().Equals(""))
                {

                    if (this.disponible.Equals(""))
                        this.disponible = "S";

                    //debo recuperar la editorial y saber si la grabo
                    nmspEDITORIAL.Editorial EdAux = this.ElLibro.getEditorial();

                    //en caso que el id de editorial sea nuevo lo tengo que agregar
                    //Si la editorial ya existe no hace nada
                    //Solo modificara el Id de editorial con el update
                    if (EdAux.get_id().Equals(0))
                        EdAux.Agregar();

                    sql = "UPDATE tblLibros SET ";
                    sql += "Titulo='" + this.ElLibro.get_titulo() + "', ";
                    sql += "Disponible='"+ this.disponible.ToUpper() + "', ";
                    sql += "ImagenLibro='"+ this.ElLibro.get_imagen_libro() + "', ";
                    sql += "Autor='" + this.ElLibro.getAutor() + "', ";
                    sql += "id_Editorial="+ EdAux.get_id() + " ";
                    sql += "WHERE tblLibros.id =" + this.idlibro;

                    resultado_update = db_conexion.ejecutarStatement(sql);
                    if (!resultado_update.Equals(0))
                        retornar_modificar = true;

                }
            }

            return retornar_modificar;
        }


        // *********************************************************************************************************
        // *********************************************************************************************************
        public bool EliminarLibroEnInventario(int pidlibro)
        {
            //debo realizar todas las validaciones de los datos que voy a grabar
            //No puedo modificar ni la fecha de alta, ni el usuario, ni el id de libro
            //El id de libro es de un usuario por lo que no importa de que usuario es.

            bool retornar_eliminar = false;
            int resultado_eliminar = 0;
            string sql;

            if (!pidlibro.Equals(0))
            {

                sql = "DELETE tblLibros ";
                sql += "WHERE tblLibros.id =" + pidlibro;

                resultado_eliminar = db_conexion.ejecutarStatement(sql);
                if (!resultado_eliminar.Equals(0))
                    retornar_eliminar = true;

            }

            return retornar_eliminar;
        }

        // *********************************************************************************************************
        // *********************************************************************************************************
        public bool EliminarLibroEnInventario()
        {
            //debo realizar todas las validaciones de los datos que voy a grabar
            //No puedo modificar ni la fecha de alta, ni el usuario, ni el id de libro
            //El id de libro es de un usuario por lo que no importa de que usuario es.

            bool retornar_eliminar = false;
            int resultado_eliminar = 0;
            string sql;

            if (!(this.ElLibro == null))
            {
                if (!this.idlibro.Equals(0))
                {

                    sql = "DELETE tblLibros ";
                    sql += "WHERE tblLibros.id =" + this.idlibro;

                    resultado_eliminar = db_conexion.ejecutarStatement(sql);
                    if (!resultado_eliminar.Equals(0))
                        retornar_eliminar = true;

                }
            }

            return retornar_eliminar;
        }


    }
}//namespace nmspLIBROENINVENTARIO